package cn.edu.nuc.bre.service.interfaces;

import java.util.Date;
import java.util.List;
import java.util.Set;

import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;

import cn.edu.nuc.bre.dto.QueryHandler;
import cn.edu.nuc.bre.entity.Transaction;
import cn.edu.nuc.bre.util.PageInfo;

/**
 * 事务服务
 * 
 * @author zwd
 * @since 2016年11月9日_上午9:04:05
 */
public interface TransactionService {
	
	/**
	 * 新增一个事务,并启动流程,无须指定编号[新事务申报]
	 * @param one
	 * @return 增加结果
	 */
	public boolean addAndStart(Transaction one) throws Exception;
	
	/**
	 * 网管待响应审核=>审核  【组任务拾取】  
	 * @param tid 事务id
	 * @param userName 执行人
	 * @param endTime 设置审核的超时时间
	 */
	public boolean respondTocheckTranaction(String userName,Integer tid,Date endTime)throws Exception;
	/**
	 * 网管审核=>(驳回)结束 
	 * @param tid 事务id
	 * @param userName 执行人
	 */
	public boolean checkTranactionNextEnd(String userName,Integer tid)throws Exception;
	/**
	 * 网管审核=>职能部门待处理响应  【多实例并发】
	 * @param tid 事务id
	 * @param userName 执行人
	 * @param deptids 需要转发的部门
	 * @param endTime 设置处理的超时时间
	 */
	public boolean checkTranactionNextDeptDeal(String userName,Integer tid,Date endTime
			,cn.edu.nuc.bre.entity.Task...childTasks)throws Exception;
	
	/**
	 * 职能部门待处理响应=>职能部门处理  【组任务拾取】//可能会有多个需要拾取,怎么区分呢,取第一个拾取。。。
	 * 之后根据部门name获取子任务，有多个就获取第一个
	 * @param tid 事务id
	 * @param userName 执行人
	 * @param deptId 当前处理人的部门name
	 */
	public boolean respondToProcessTranaction(String userName,Integer tid,String deptName)throws Exception;
	/**
	 * 职能部门处理=>转发下一部门  【转发操作】
	 * @param tid 事务id
	 * @param userName 执行人
	 * @param deptId 当前处理人的部门name
	 * @param childTask 新增一个子任务
	 */
	public boolean processTranactionNextForWord(Integer tid,String deptName,String userName,
			cn.edu.nuc.bre.entity.Task newChildTask)throws Exception;
	/**
	 * 职能部门处理=>处理结束 
	 * @param tid 事务id
	 * @param userName 执行人
	 * @param deptId 当前处理人的部门name
	 */
	public boolean processTranactionNextEnd(Integer tid,String userName,String deptName)throws Exception;
	/**
	 * 网点办结=>结束   【对本次事务处理的打分和评价】
	 * @param tid 事务id
	 * @param userName 执行人
	 * @param tsatisfdesc 对事务处理的评价
	 * @param tsatisfaction 打分
	 */
	public boolean closeTranactionNextEnd(String userName,Integer tid,
			String tsatisfdesc,Integer tsatisfaction)throws Exception;
	/**
	 * 网点办结=>驳回 
	 * @param tid 事务id
	 * @param userName 执行人
	 */
	public boolean closeTranactionNextRollBack(String userName,Integer tid,String deptid)throws Exception;
	/**
	 * 网点回收事务操作[无需指定执行人]
	 * @param tid 事务id
	 */
	public boolean  giveUpTranaction(Integer tid);
	/**
	 * 提交行长操作
	 * @param tid 事务id
	 * @param tpresidentFlag 该字段状态
	 * 设置是否提交行长
	 */
	public boolean editTpresidentCode(Integer tid,boolean tpresidentFlag);
	/**
	 * 延时操作
	 * @param tid 事务id
	 * @param ttimeout 修改后超时时间
	 */
	public boolean editTimeout(Integer tid,Date ttimeout);
	/**
	 * 给指定id事务添加批注，催办等信息 ps:传入格式化好的信息
	 * 
	 * @param tid
	 * @param taskId   任务结点id ,用于指定批注对象
	 * @param msgType   类型[批注和催办]，如果是催办,会修改事务催办次数
	 * @param msg 格式化好的信息,处理人等。。。
	 * @param isPressMsg 是否为
	 * @return 添加结果
	 */
	public boolean addComment(Integer tid,String taskId,String msgType,String msg);
	
	/**
	 * 查看指定id的事务当前执行所处节点任务,不唯一[事务详情,添加批注时会用到]
	 * 注:不同于事务子任务,取重名了...
	 * @param tid
	 * @return 公共实体
	 */
	public List<Task> findTasksById(Integer tid);
	/**
	 * 查看指定id的事务基本信息[事务详情]
	 * 
	 * @param tid
	 * @return 公共实体
	 */
	public Transaction findById(Integer tid);

	/**
	 * 查看指定id的事务下所有批注信息[事务详情]
	 * 
	 * @param tid
	 * @return 批注信息
	 */
	public List<Comment> findCommentsById(Integer tid);

	/**
	 * 查看指定id的事务下所有子任务信息[事务详情]
	 * 
	 * @param tid
	 * @return 子任务信息
	 */
	public List<cn.edu.nuc.bre.entity.Task> findChildTasksById(Integer tid);
	
	/**
	 * 查看指定id的事务下所有所有历史结点信息[事务详情]
	 * 
	 * @param tid
	 * @return 历史信息
	 */
	public List<HistoricActivityInstance> findHistoricActivityInstanceById(Integer tid);

	/**
	 * 依据用户名去获取用户所经手的已办结事务[事务列表=>已办结]
	 * 
	 * @param assigneeName
	 * @return
	 */
	public List<Transaction> findFinishedByAssignee(String assigneeName);

	/**
	 * 依据用户名去获取用户关注中的事务[事务列表=>关注中]
	 * 
	 * @param assigneeName
	 * @return
	 */
	public List<Transaction> findFollowingByAssignee(String assigneeName);

	/**
	 * 依据用户名去获取用户需要拾取的事务[事务列表=>待办理]
	 * 建议和正在办理的分开显示
	 * 
	 * @param assigneeName
	 * @return
	 */
	public List<Transaction> findNeedClaimByAssignee(String assigneeName);

	/**
	 * 依据用户名去获取用户正在办理的事务[事务列表=>待办理]
	 * 建议和可以拾取的的分开显示
	 * @param assigneeName
	 * @return
	 */
	public List<Transaction> findNeedDealByAssignee(String assigneeName);

	/**
	 * 按条件筛选得到的事务,可用于[行长查看]
	 * 
	 * @param qu
	 *            筛选类
	 * @return 返回pageInfox信息
	 */
	public PageInfo<Transaction> findByQueryHandler(QueryHandler qu);
}
